const bcrypt = require('bcryptjs') // 加密密码
//用户模块相关的中间件
const {getUserInfo}=require('../service/user.service')
const {userFormateError,userAlreadyExist,userRegisterError,userDoesNotExist,userLoginError,invalidPassword} =require('../constant/err.type')
const userValidator = async (ctx, next) => {
    //1.验证用户信息的合法性
    const {user_name,password}= ctx.request.body
    if(!user_name || !password){
        console.error('用户名或密码为空',ctx.request.body);
        ctx.app.emit('error',userFormateError,ctx)
        return;
    }
    await next();
   
}

const verifyUser = async (ctx, next) => {
    //2.验证用户是否存在
    const {user_name}= ctx.request.body
    // if(await getUserInfo({user_name})){
    //    ctx.app.emit('error',userAlreadyExist,ctx)
    //     return;
    // }
    try {
        const res = await getUserInfo({user_name})
        if(res){
            console.log('用户已存在',{user_name});
            ctx.app.emit('error',userAlreadyExist,ctx)
            return;
        }
    } catch (err) {
        console.error('获取用户信息失败',err);
        ctx.app.emit('error',userRegisterError,ctx)
        return;
        
    }
    await next();

}

//密码加密
const crpytPassword = async (ctx, next) => {
    //3.密码加密
    const {password}= ctx.request.body
    const salt = bcrypt.genSaltSync(10)  // 生成盐
    const hash = bcrypt.hashSync(password, salt) // 加密密码    
    ctx.request.body.password = hash // 替换密码(将明文密码替换为密文)
    await next(); // 继续向下执行
}

const verifyLogin = async (ctx, next) => {
    //1.验证用户是否存在(不存在则报错

    const {user_name,password}= ctx.request.body
    try {
        const res = await getUserInfo({user_name})
        if(!res){
            console.error('用户不存在',{user_name});
            ctx.app.emit('error',userDoesNotExist,ctx)
            return;
        }

            //2.验证密码是否正确(不正确则报错)
    if(!bcrypt.compareSync(password, res.password))
        {
            ctx.app.emit('error',invalidPassword,ctx)
            return;
        }
    } catch(err){
        console.error('用户登录失败',err);
        ctx.app.emit('error',userLoginError,ctx)
        return; 
    }


    await next();


 
    
}
module.exports = {
    userValidator,
    verifyUser,
    crpytPassword,
    verifyLogin
}